package cn.itcast.web.controller.system;

import cn.itcast.domain.system.Module;
import cn.itcast.domain.system.Role;
import cn.itcast.domain.system.User;
import cn.itcast.service.system.ModuleService;
import cn.itcast.service.system.RoleService;
import cn.itcast.web.controller.BaseController;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("/system/role/")
public class RoleController extends BaseController {

	@Autowired
	private RoleService roleService;

	@Autowired
	private ModuleService moduleService;

	/**
	 * 分页
	 */
	@RequestMapping("/list")
	public String list(@RequestParam(defaultValue = "1") int page,
	                   @RequestParam(defaultValue = "5") int size) {
		//1.调用service查询
		PageInfo info = roleService.findAll(getLoginCompanyId(),page,size);
		//2.存入到request域中
		request.setAttribute("page",info);
		//3.跳转页面
		return "system/role/role-list";
	}

	/**
	 * 进入保存
	 */
	@RequestMapping("/toAdd")
	public String toAdd() {
		//跳转页面
		return "system/role/role-add";
	}

	/**
	 * 进入更新
	 */
	@RequestMapping("/toUpdate")
	public String toUpdate(String id) {
		//根据id查询角色
		Role role = roleService.findById(id);
		request.setAttribute("role",role);
		//跳转页面
		return "system/role/role-update";
	}


	/**
	 * 新增或者修改
	 */
	@RequestMapping("/edit")
	public String edit(Role role) {
		//1.设置租户数据（基本信息）
		role.setCompanyId(getLoginCompanyId());
		role.setCompanyName(getLoginCompanyName());

		//2.判断参数中是否具有id
		if(StringUtils.isEmpty(role.getId())) {
			//2.1 如果没有id，保存
			roleService.save(role);
		}else{
			//2.2 有id，更新
			roleService.update(role);
		}
		//3.重定向到列表
		return "redirect:/system/role/list.do";
	}

	/**
	 * 删除
	 */
	@RequestMapping("/delete")
	public String delete(String id) {
		//1.调用service删除
		roleService.delete(id);
		//2.重定向到列表
		return "redirect:/system/role/list.do";
	}

	/**
	 * 进入分配模块页面
	 */
	@RequestMapping("/roleModule")
	public String roleModule(String roleid) {
		//1.调用service根据id查询角色
		Role role = roleService.findById(roleid);
		request.setAttribute("role",role);
		//2.跳转页面
		return "system/role/role-module";
	}

	/**
	 * 业务：在java代码中接收ajax请求，构造菜单节点数据
	 * 返回值：List<Map> : 自动的转化为json
	 *      一个Map集合 == 相当于数据库中的一个模块对象
	 * 方法的返回值应该如何配置：
	 *      在返回值之前可以通过@ResponseBody修饰返回值
	 *      自动的将对象转化为json字符串并相应
	 * 业务逻辑
	 *      1.查询所有的模块数据   ：Module对象
	 *      2.将module对象转化成map集合
	 *      3.map集合中的key如何命名 ： { id:122, pId:12, name:"随意勾选 1-2-2", checked:true}
	 *
	 *  为了回显数据：对代码进行改造
	 *      1.请求参数：当前配置的角色Id
	 *      2.业务：需要查询出当前角色具有的所有模块数据
	 */
	@RequestMapping("/getZtreeNodes")
	public @ResponseBody List<Map> getZtreeNodes(String roleId) {
		List<Map> list = new ArrayList<>();
		//1.查询所有的模块
		List<Module> modules = moduleService.findAll();                 //系统管理，用户管理，角色管理，企业管理
		//2.根据角色id，查询当前角色所具有的模块权限
		List<Module> roleModules = moduleService.findByRoleId(roleId);  //用户管理，角色管理
		//3.循环所有模块，通过module对象构造map集合
		for (Module module : modules) { //系统管理，用户管理，角色管理，企业管理
			Map map = new HashMap();        //
			map.put("id",module.getId());
			map.put("pId",module.getParentId());
			map.put("name",module.getName());
			//判断角色的模块结合中是否包含当前循环的模块
			if(roleModules.contains(module)) {
				map.put("checked",true); //如果当前角色的所有权限中包含某个权限（添加checked=true）
			}
			list.add(map);
		}
		//3.返回
		return list;
	}


	/**
	 * 对角色分配可操作菜单的权限
	 *  参数：
	 *      roleid: 角色id
	 *      moduleIds: 勾选的模块id字符串，以“，”分开
	 *   业务
	 *      调用service完成分配
	 */
	@RequestMapping("/updateRoleModule")
	public String updateRoleModule(String roleid,String moduleIds) {
		roleService.updateRoleModule(roleid,moduleIds);
		return "redirect:/system/role/list.do";
	}
}
